package pay.redis;

import org.redisson.RedissonMultiLock;
import org.redisson.RedissonRedLock;
import org.redisson.api.RLock;
import org.redisson.api.RReadWriteLock;
import org.springframework.validation.annotation.Validated;

import javax.validation.constraints.NotBlank;

/**
 * Redisson分布式锁服务
 * 参考文档：https://blog.csdn.net/l1028386804/article/details/73523810
 *
 */
@Validated
public interface RLockService {

	/**
	 * 可重入锁（Reentrant Lock）
	 *
	 * @param lockKey
	 * @return
	 */
	RLock getLock(@NotBlank String lockKey);

	/**
	 * 公平锁（Fair Lock）
	 *
	 * @param lockKey
	 * @return
	 */
	RLock getFairLock(@NotBlank String lockKey);

	/**
	 * 联锁（MultiLock）
	 *
	 * @param locks - array of locks
	 * @return
	 */
	RedissonMultiLock getMultiLock(RLock... locks);

	/**
	 * 红锁（RedLock）
	 *
	 * @param locks - array of locks
	 * @return
	 */
	RedissonRedLock getRedLock(RLock... locks);

	/**
	 * 读写锁（ReadWriteLock）
	 * @param lockKey
	 * @return
	 */
	RReadWriteLock getReadWriteLock(@NotBlank String lockKey);

}
